/*
 * brief: 本模块作用作为发布订阅设计模式的客户端，连接服务端，并注册事件回调
 * use  : 1、实例化             CMsgInstanceClient    
 *        2、循环调度 调度函数  MsgSchedule
 *        3、订阅与发布         MsgEventRegister MsgPublish
*/

#ifndef __MSGINSTANCE_H_
#define __MSGINSTANCE_H_

#include <iostream>
#include <stdio.h>
#include <deque>
#include <list>
#include <map>
#include <vector>
#include <stdarg.h>
#include "MsgEventID.h"
#include <time.h>
#include "Communication.h"
#include "ComLog.h"
#include <string.h>
using namespace std;


class CMsgInstanceClient
{
    public :
        CMsgInstanceClient(char *addr, int port, int skeepalive);
       ~CMsgInstanceClient();

        //可变参 1 this 2 函数 3 data
        int MsgEventRegister(int msgSource, eEVENTID event, ...); 
        int MsgEventUnRegister(int msgSource, eEVENTID event); 

        //发布消息
        int MsgPublish(eEVENTID event, void *data, int datalen, char needresponse);
        
        //实例调度函数
        int MsgSchedule();

        //调试使用
        void PrinteventList();

        //测试回调
        void TestEventCB(char *msg, int msgLen, void *data);
    private:
        void MsgSendHeartPack();
        void MsgRegisterEventDataWrite(eEVENTID event);
        void MsgDistributePack(MsgPacket *msgPacket);
        char *MsgConvertMsgpacketToByte(MsgPacket *msgPacket);
        MsgPacket *MsgConvertByteToMsgpacket(char *data, int datalen);
        void *msgHandler; //消息发送接收句柄
        map<int, map<int, CBEvent> > eventList; //事件 源ID 事件元素
        int m_fd; //连接消息中心的fd
        int m_skeepalive ; //心跳间隔时间
        char m_readbuf[6096]; //网络读取缓冲区
        int m_validlen; //当前有效数据长度
        CCommunication *m_Communi;//通信实例
        char m_addr[80]; //连接地址
        int m_port; //连接端口
        time_t lastKeepaliveTime; //上一次心跳时间
    
};






#endif